/*******************************************************************************
 * Copyright (c) 2003, 2009 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.internal.progress;

import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.internal.WorkbenchWindow;

/**
 * The AnimationItem is the class that manages the animation for the progress.
 */
public abstract class AnimationItem {
    WorkbenchWindow window;

    interface IAnimationContainer {
        /**
         * The animation has started. 
         */
        public abstract void animationStart();

        /**
         * The animation has ended. 
         */
        public abstract void animationDone();
    }

    //Create a containter that does nothing by default
    IAnimationContainer animationContainer = new IAnimationContainer() {
        /* (non-Javadoc)
         * @see org.eclipse.ui.internal.progress.AnimationItem.IAnimationContainer#animationDone()
         */
        public void animationDone() {
            //Do nothing by default
        }

        /* (non-Javadoc)
         * @see org.eclipse.ui.internal.progress.AnimationItem.IAnimationContainer#animationStart()
         */
        public void animationStart() {
            //Do nothing by default
        }
    };

    /**
     * Create a new instance of the receiver.
     * 
     * @param workbenchWindow
     *            the window being created
     */
    public AnimationItem(WorkbenchWindow workbenchWindow) {
        this.window = workbenchWindow;
    }

    /**
     * Create the canvas that will display the image.
     * 
     * @param parent
     */
    public void createControl(Composite parent) {

        Control animationItem = createAnimationItem(parent);

        animationItem.addMouseListener(new MouseListener() {
            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
             */
            public void mouseDoubleClick(MouseEvent arg0) {
                ProgressManagerUtil.openProgressView(AnimationItem.this.window);
            }

            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
             */
            public void mouseDown(MouseEvent arg0) {
                //Do nothing
            }

            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
             */
            public void mouseUp(MouseEvent arg0) {
                //Do nothing
            }
        });
        animationItem.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                AnimationManager.getInstance().removeItem(AnimationItem.this);
            }
        });
        AnimationManager.getInstance().addItem(this);
    }

    /**
     * Create the animation item control.
     * @param parent the parent Composite
     * @return Control
     */
    protected abstract Control createAnimationItem(Composite parent);

    /**
     * Paint the image in the canvas.
     * 
     * @param event
     *            The PaintEvent that generated this call.
     * @param image
     *            The image to display
     * @param imageData
     *            The array of ImageData. Required to show an animation.
     */
    // RAP [bm]: GC
//    void paintImage(PaintEvent event, Image image, ImageData imageData) {
//        event.gc.drawImage(image, 0, 0);
//    }

    /**
     * Get the SWT control for the receiver.
     * 
     * @return Control
     */
    public abstract Control getControl();

    /**
     * The animation has begun.
     */
    void animationStart() {
        animationContainer.animationStart();
    }

    /**
     * The animation has ended.
     */
    void animationDone() {
        animationContainer.animationDone();
    }

    /**
     * Get the preferred width of the receiver.
     * 
     * @return int
     */
    public int getPreferredWidth() {
        return AnimationManager.getInstance().getPreferredWidth() + 5;
    }

    /**
     * Set the container that will be updated when this runs.
     * @param container The animationContainer to set.
     */
    void setAnimationContainer(IAnimationContainer container) {
        this.animationContainer = container;
    }

	/**
	 * @return Returns the window.
	 */
	public WorkbenchWindow getWindow() {
		return window;
	}
}
